package com.omuao.core.lang.base.facade;

import com.omuao.common.exception.ServiceException;
import com.omuao.common.utils.page.Page;

import java.util.List;

/**
 * 基础业务
 *
 * @author yumi@omuao.com
 * @since 2019-10-17
 **/
public interface BaseService<T, DTO> {

    /**
     * 根据唯一ID查询记录
     *
     * @param unionId 唯一ID
     * @return 记录
     * @throws ServiceException 业务异常
     */
    T selectByUnionId(Long unionId) throws ServiceException;

    /**
     * 根据DTO条件查询记录
     *
     * @param recordDto DTO条件
     * @param page      分页
     * @return 记录列表
     * @throws ServiceException 业务异常
     */
    List<T> selectListByDto(DTO recordDto, Page page) throws ServiceException;

    /**
     * 根据DTO条件查询单个记录
     *
     * @param recordDto DTO条件
     * @param page      分页
     * @return 记录列表
     * @throws ServiceException 业务异常
     */
    List<T> selectSingle(DTO recordDto, Page page) throws ServiceException;

    /**
     * 根据DTO条件查询记录列表
     *
     * @param recordDto DTO条件
     * @param page      分页
     * @return 记录列表
     * @throws ServiceException 业务异常
     */
    List<T> selectSimpleList(DTO recordDto, Page page) throws ServiceException;

    /**
     * 切换禁用状态
     *
     * @param recordDto DTO条件
     * @return 成功条数
     * @throws ServiceException 业务异常
     */
    int toggleDisable(DTO recordDto) throws ServiceException;

    /**
     * 切换删除状态
     *
     * @param recordDto DTO条件
     * @return 成功条数
     * @throws ServiceException 业务异常
     */
    int toggleDelete(DTO recordDto) throws ServiceException;

    /**
     * 根据唯一ID查询记录
     *
     * @param unionId 唯一ID
     * @param lock    读加锁
     * @param timeout 超时时间
     * @return 记录
     * @throws ServiceException 业务异常
     */
    T selectByUnionIdLock(Long unionId, Boolean lock, Long timeout) throws ServiceException;
}